package com.ydd.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.ydd.constant.MessageConstant;
import com.ydd.constant.QueryConstant;
import com.ydd.dto.AddUserDTO;
import com.ydd.dto.PageDTO;
import com.ydd.dto.UpdateUserDTO;
import com.ydd.dto.UserLoginDTO;
import com.ydd.entity.YddArticle;
import com.ydd.entity.YddUser;
import com.ydd.entity.YddUserData;
import com.ydd.mapper.YddArticleMapper;
import com.ydd.mapper.YddUserDataMapper;
import com.ydd.mapper.YddUserMapper;
import com.ydd.result.Result;
import com.ydd.service.IYddUserService;
import com.ydd.vo.PageUserVo;
import com.ydd.vo.YddUserInfoVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import javax.security.auth.login.AccountNotFoundException;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author itcast
 * @since 2023-05-15
 */
@Service
public class YddUserServiceImpl extends ServiceImpl<YddUserMapper, YddUser> implements IYddUserService {

    @Autowired
    private YddUserMapper yddUserMapper;
    @Autowired
    private YddArticleMapper yddArticleMapper;
    @Autowired
    private YddUserDataMapper yddUserDataMapper;

    /**
     * 用户登录
     *
     * @param userLoginDTO
     * @return
     */
    @Override
    public YddUser login(UserLoginDTO userLoginDTO) throws AccountNotFoundException {
        String mobile = userLoginDTO.getMobile();
        String password = userLoginDTO.getPassword();

        YddUser yddUser = yddUserMapper.getUserPassword(mobile);

        if (yddUser == null) {
            //账号不存在
            throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
        }
        //密码比对
        // TODO 后期需要进行md5加密，然后再进行比对
        //获取加密后的密码
        String pwd = DigestUtils.md5DigestAsHex(password.getBytes());
        if (!pwd.equals(yddUser.getPassword())) {
            //密码错误
            throw new AccountNotFoundException(MessageConstant.PASSWORD_ERROR);
        }

        //3、返回实体对象
        return yddUser;
    }

    /**
     * 获取用户信息
     *
     * @return
     */
    @Override
    public YddUserInfoVO getUserInfo(){
        /*Long currentId = BaseContext.getCurrentId();*/
        // 根据id查询用户信息
        YddUser user = yddUserMapper.selectById(136);
        // 判断用户是否存在
        /*if (user == null) {
            throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
        }*/
        // 查询用户文章数
        Long articleNum = yddArticleMapper.selectCount(new LambdaQueryWrapper<YddArticle>().eq(YddArticle::getUserId, 136));
        // 查询用户点赞数
        Long zanNum = yddUserDataMapper.selectCount(new LambdaQueryWrapper<YddUserData>().eq(YddUserData::getUserId, 136)
                .eq(YddUserData::getType, QueryConstant.ZAN_TYPE));
        // 查询用户收藏数
        Long collectNum = yddUserDataMapper.selectCount(new LambdaQueryWrapper<YddUserData>().eq(YddUserData::getUserId,136)
                .eq(YddUserData::getType, QueryConstant.COLLECT_TYPE));

        return YddUserInfoVO.builder()
                .userInfo(user).articleNum(articleNum).zanNum(zanNum).collectNum(collectNum).build();
    }
    /**
     * 根据id查询用户详情
     *
     * @param id
     * @return
     */
    @Override
    public Result userDetail(String id) {
        if (id == null) {
            return Result.error(MessageConstant.UNKNOWN_ERROR);
        }

        YddUser yddUser = yddUserMapper.searchById(id);

        if (yddUser.getId() == null){
            return Result.error(MessageConstant.ACCOUNT_NOT_FOUND);
        }

        return Result.success(yddUser);
    }

    /**
     * 查询所有用户, 也可以根据条件查询
     *
     * @param pageDTO
     * @return
     */
    @Override
    public Result searchUser(PageDTO pageDTO) {
        if (pageDTO.getPage() == null) {
            pageDTO.setPage(1);
        }
        if (pageDTO.getLimit() == null){
            pageDTO.setLimit(10);
        }

        // 开始执行分页
        PageHelper.startPage(Integer.valueOf(pageDTO.getPage()), Integer.valueOf(pageDTO.getLimit()));

        // 条件查询
       Page<YddUser> pageUser = yddUserMapper.searchUser(pageDTO);

        // 总条数及集合
        long total = pageUser.getTotal();

        PageUserVo pageUserVo = new PageUserVo();
        // 总条数
        Integer count = Math.toIntExact(total);
        // 总页数
        Integer totalPages = count / Integer.valueOf(pageDTO.getPage());
        pageUserVo.setCount(count);
        pageUserVo.setPageSize(totalPages);
        // 每页数量
        pageUserVo.setPageSize(Integer.valueOf(pageDTO.getLimit()));
        // 当前页数
        pageUserVo.setCurrentPage(Integer.valueOf(pageDTO.getPage()));

        List<YddUser> yddUserList = pageUser.getResult();
        pageUserVo.setData(yddUserList);

        // 返回数据
        return Result.success(pageUserVo);
    }

    /**
     * 添加用户
     *
     * @param addUserDTO
     * @return
     */
    @Override
    public Result addUser(AddUserDTO addUserDTO) {
        // 判断是否为空
        if (addUserDTO.getUsername() == null) {
            return Result.error(MessageConstant.UNKNOWN_ERROR);
        }
        // 添加数据到数据库
        yddUserMapper.addUser(addUserDTO);

        return Result.success();
    }

    /**
     * 根据id删除用户
     *
     * @param id
     * @return
     */
    @Override
    public Result deleteUserById(String id) {
        if (id == null) {
            return Result.error(MessageConstant.UNKNOWN_ERROR);
        }

        yddUserMapper.deleteUserById(id);
        return Result.success();
    }

    /**
     * 修改用户
     *
     * @param updateUserDTO
     * @return
     */
    @Override
    public Result updateUser(UpdateUserDTO updateUserDTO) {
        yddUserMapper.updateUser(updateUserDTO);
        return Result.success();
    }
}
